/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package br.siagefi.service;

import br.siagefi.dao.DAO;
import br.siagefi.model.Documento;
import br.siagefi.model.NotaFiscal;
import br.siagefi.model.Pessoa;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author NOTE
 */
public class NotaFiscalService {
    
    private final DAO<NotaFiscal> dao;
    private final LancamentoService lctoService;
    private final DocumentoService dctoService;

    public NotaFiscalService() {
        this.dao = new DAO<>(NotaFiscal.class);
        this.lctoService = new LancamentoService();
        this.dctoService = new DocumentoService();
    }
    
    public void inserir(NotaFiscal notaFiscal){
        dao.adiciona(notaFiscal);
    }
    
    public void alterar(NotaFiscal notaFiscal){
        dao.atualiza(notaFiscal);
    }
    
    public List<NotaFiscal> listar(){
        return dao.listaTodos();
    }
    
    public void remover(NotaFiscal notaFiscal){
       // dao.remove(notaFiscal);
        dctoService.remover(notaFiscal.getDocumento());
    }
    
    public void gravarNotaFiscal(NotaFiscal nf) {
        dctoService.gravarDocumento(nf.getDocumento());
        this.inserir(nf);
    }
    
    public boolean jaExiste(NotaFiscal notaFiscal) {
        List<NotaFiscal> lista = this.listar();
        for (NotaFiscal nf : lista) 
            if(nf.equals(notaFiscal))
                return true;
        return false;
    }
    
    public Documento incluirDocumento (NotaFiscal nf){
        double retencao = nf.getValorBruto() * nf.getRetencao();
        double imposto = nf.getValorBruto() * nf.getAliquotaImpostoUnico();
        double valor = nf.getValorBruto() - retencao - imposto;
        Documento doc = nf.getDocumento();
        doc.setNatureza("CREDITO");
        doc.setNrDocumento(nf.getNumero());
        doc.setDataEmissao(nf.getDataVencimento());
        doc.setPessoa(nf.getCliente());
        doc.setValor(valor);
        doc.setFormaPagamento("A_VISTA");
        doc.setSituacao(dctoService.obterSituacao(nf.getDataEmissao()));
        dctoService.incluirLancamento(doc);
        return doc;
    }
    
    public boolean existeLancamentoVinculado(NotaFiscal notaFiscal) {
         return notaFiscal.getDocumento() != null;
    }
    
    public List<Pessoa> listarClientes(String origem) {
        List<Pessoa> lista;
        if(origem == null){
            return null;
        }else {
            if (origem.equals("CLIENTE_PF")){
                 lista = new ArrayList(new ClientePFService().listar());
                 return lista;
            }
            if (origem.equals("CLIENTE_PJ")){
                 lista = new ArrayList(new ClientePJService().listar());
                 return lista;
            }
            return null;
        }
    }

    public void atualizaSaldo(NotaFiscal notaFiscal) {
        dctoService.atualizaSaldo(notaFiscal.getDocumento());
    }
    
    public void reverterLancamentos(NotaFiscal notaFiscal){
        dctoService.reverterLancamentos(notaFiscal.getDocumento());
    }
    
}






